/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = CUPS_core.h                                                    */
/*  NOTE      =                                                               */
/*  DATE      = 2014/09/28 by zhengxd                                         */
/******************************************************************************/
#ifndef _CUPS_CORE_H_
#define _CUPS_CORE_H_

#include "cups_base_type.h"

/*
 *  分片包数据
*/
typedef struct __st_L7_fragment_cups {

    int i_req_resp;                                   /* 数据类型 */
    unsigned int ui_packet_len;                      /* 数据长度 */
    unsigned int ui_map_len;                         /* 位图长度 */
    unsigned int ui_rej_code;                        /* 拒绝码 */
    char arr_dest_id[CUPS_ID_LEN + 1];               /* 目的ID */
    char arr_src_id[CUPS_ID_LEN + 1];                /* 源的ID */
    char arr_trans_info[CUPS_TRANS_INFO_LEN + 1];    /* 交易信息 */
    char arr_msg_type[CUPS_MSG_TP_LEN + 1];          /* message type */
    char arr_map_bit[CUPS_MAP_MAX_LEN + 1];          /* 位图 */
    Frbyte_Packet *p_st_data;                         /* packet数据 */
    struct timeval st_start_timestamp;               /* 开始分片包的时间 */
    struct timeval st_end_timestamp;                 /* 结束分片包的时间 */
} L7_fragment_cups;

/*
 *  CUPS请求
 *  对应L7_requestdata中的p_request_private数据
*/
typedef struct __st_L7_req_cups {

    unsigned int ui_currency;
    unsigned long ul_request_bytes;
    unsigned long ul_send_time_us;
    unsigned long ul_req_sequence;
    char arr_msg_type[CUPS_MSG_TP_LEN + 1];    /* message type */
    char arr_trans_info[CUPS_TRANS_INFO_LEN + 1];    /* 交易信息 */
    char arr_dest_id[CUPS_ID_LEN + 1];               /* 目的ID */
    char arr_src_id[CUPS_ID_LEN + 1];                /* 源的ID */
    Frlist_header st_param;                     /* 参数列表 */
    struct timeval st_start_timestamp;         /* 开始分片包的时间 */
    struct timeval st_end_timestamp;           /* 结束分片包的时间 */
} L7_req_cups;

/*
 *  CUPS响应
 *  解析response过程中的数据
*/
typedef struct __st_L7_resp_cups {

    char *p_error_msg;
    char arr_ret_code[5 + 1];
}L7_resp_cups;

/*
 *  CUPS私有数据
*/
typedef struct __st_L7session_cups_private {

    L7_fragment_cups *p_st_fragment;       /* 分片包数据 */
    L7_req_cups *p_st_req;                 /* request数据 */
    L7_resp_cups *p_st_resp;               /* response信息 */
} L7session_cups_private;

int cups_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);

int cups_analysis(Conntrack *p_st_conn
                , Apm_packet *p_st_packet
                , Frhash_header *p_st_hash_report);

int cups_session_destroy(void *p_private_session);

#endif
